/**
 * @file 全局工具方法
 *
 * @author liubin29(liubin29@baidu.com)
 * 2016年4月14日
 */
import _ from 'lodash';

/**
 * 格式化时间
 *
 * @param {Object} date 日期对象
 * @param {string} fmt 格式
 * @return {string} value
 */
export function formatDate(date, fmt) {
    let o = {
        'M+': date.getMonth() + 1,
        'd+': date.getDate(), // 日
        'h+': date.getHours(), // 小时
        'm+': date.getMinutes(), // 分
        's+': date.getSeconds(), // 秒
        'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
        'S': date.getMilliseconds() // 毫秒
    };
    if (/(y+)/.test(fmt)) {
        fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
    }

    for (let k in o) {
        if (new RegExp('(' + k + ')').test(fmt)) {
            fmt = fmt.replace(RegExp.$1, RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length));
        }

    }
    return fmt;
}

export function loadJS(url) {
    return new Promise((resolve, reject) => {
        let head = document.getElementsByTagName('head')[0];
        let script = document.createElement('script');
        script.callback = false;

        script.onreadystatechange = () => {
            if (this.readyState === 'complete' && !script.callback) {
                script.callback = true;
                resolve();
            }

        };
        script.onload = () => {
            if (!script.callback) {
                script.callback = true;
                resolve();
            }

        };

        script.src = url;
        head.appendChild(script);
    });
}

// 判断是否相同，包括数组和object
export function isEqual(x, y) {
    if (x === y) {
        return true;
    }

    if (!(x instanceof Object) || !(y instanceof Object)) {
        return false;
    }

    if (x.constructor !== y.constructor) {
        return false;
    }

    for (let p in x) {
        if (x.hasOwnProperty(p)) {
            if (!y.hasOwnProperty(p)) {
                return false;
            }

            if (x[p] === y[p]) {
                continue;
            }

            if (typeof x[p] !== 'object') {
                return false;
            }

            if (!isEqual(x[p], y[p])) {
                return false;
            }
        }

    }

    for (let p in y) {
        if (y.hasOwnProperty(p) && !x.hasOwnProperty(p)) {
            return false;
        }

    }
    return true;
}

/**
 * 获取问号后面参数信息
 *
 * @param {string} url 路由地址
 * @return {Object} query对象
 */
export function parseQuery(url) {
    url = url ? url : window.location.href;
    let regUrl = /^[^\?]+\?([\w\W]+)$/;
    let regPara = /([^&=]+)=([\w\W]*?)(&|$|#)/g;
    let arrUrl = regUrl.exec(url);
    let ret = {};
    if (arrUrl && arrUrl[1]) {
        let strPara = arrUrl[1];
        let result;
        while ((result = regPara.exec(strPara)) != null) {
            ret[result[1]] = result[2];
        }
    }

    return ret;
}

/**
 * 将字符串转化为boolean值
 *
 * @param {string} str 待转换字符串
 * @return {bool}
 */
export function toBoolean(str) {
    if (_.isBoolean(str)) {
        return str;
    }

    let ret = {
        true: true,
        false: false
    };
    if (str in ret) {
        return ret[str];
    }

    throw '不能将' + str + '转成Boolean类型';
}

/**
 * 将数组分割成指定个数的新数组
 *
 * @param {Array} array 待处理数组
 * @param {number} subGroupLength 长度
 * @return {Array} 一个新的数组
 */
export function groupArray(array, subGroupLength) {
    let index = 0;
    let newArray = [];
    while (index < array.length) {
        newArray.push(array.slice(index, index += subGroupLength));
    }
    return newArray;
}

/**
 * 获取页面scrollTop的兼容性问题解决，具体原因参考 https://segmentfault.com/a/1190000005063489
 */

export function getScrollTopOfBody() {
    let scrollTop;
    if (typeof window.pageYOffset !== 'undefined') {
        // pageYOffset指的是滚动条顶部到网页顶部的距离
        scrollTop = window.pageYOffset;
    }
    else if (typeof document.compatMode !== 'undefined' && document.compatMode !== 'BackCompat') {
        scrollTop = document.documentElement.scrollTop;
    }
    else if (typeof document.body !== 'undefined') {
        scrollTop = document.body.scrollTop;
    }

    return scrollTop;
}
